import java.awt.BorderLayout;
import java.awt.EventQueue;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.swing.JLabel;
import javax.swing.JTextField;
import javax.swing.DropMode;
import java.awt.Color;
import javax.swing.JButton;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import java.text.ParseException;
import java.util.GregorianCalendar;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;

import javax.swing.JOptionPane;
import java.awt.Font;
import javax.swing.JFormattedTextField;
import javax.swing.text.MaskFormatter;
import javax.swing.DefaultComboBoxModel;
import javax.swing.JSeparator;
import javax.swing.JComboBox;
import javax.swing.JSpinner;
import javax.swing.JList;
import javax.swing.JToggleButton;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.ItemListener;
import java.awt.event.ItemEvent;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import java.awt.event.InputMethodListener;
import java.awt.event.InputMethodEvent;

public class VueCompteSociete extends Vue {

	/**
	 * 
	 */
	//private static final long serialVersionUID = 5069349224425178639L;
	private JPanel contentPane;
	private JTextField textFieldNom;
	
	private JButton btnEnregistrer;
	private JButton btnFermer;
	private Societe	_societe ;
	private HashSet<Mandataire> _mandataires;
	private CompteSociete _compte;
	private HashSet<CompteSociete> _cpts;
	private JSeparator separator;
	private JLabel lblChoisirUnCompte;
	private JComboBox listeCompte;
	private final JLabel lblCompte = new JLabel("Numéro de Compte :");
	private JLabel lblSolde;
	private JLabel lbSolde;
	private JLabel lbType;
	private JLabel lbDecouvert; 
	private JLabel lbNum;
	private JComboBox listMand;
	private JLabel ladroits;
	private JLabel textDroits;
	private JComboBox effaceCombo;
	/**
	 * Create the frame.
	 * @throws ParseException 
	 */
	public VueCompteSociete(Controleur controleur) throws ParseException {
		super (controleur);
		setTitle("Consulter un compte Société");
		setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
		setBounds(100, 100, 600, 400);
		contentPane = new JPanel();
		contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
		setContentPane(contentPane);
		contentPane.setLayout(null);
		
		JLabel lblNom = new JLabel("Numéro Siren :");
		lblNom.setBounds(61, 30, 97, 16);
		contentPane.add(lblNom);
		
		textFieldNom = new JTextField();
		textFieldNom.setBounds(176, 25, 231, 28);
		textFieldNom.setBackground(new Color(255, 255, 255));
		contentPane.add(textFieldNom);
		textFieldNom.setColumns(10);
		
		btnEnregistrer = new JButton("Rechercher");
		btnEnregistrer.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {
				String numS = textFieldNom.getText().trim().toLowerCase();
				getControleur().getCompteSociete(getControleur().rechSociete(numS));
				aliment();
			}
		});
		btnEnregistrer.setBounds(454, 24, 117, 29);
		contentPane.add(btnEnregistrer);
		
		separator = new JSeparator();
		separator.setBounds(12, 65, 573, 3);
		contentPane.add(separator);
		
		lblChoisirUnCompte = new JLabel("Choisir un Compte");
		lblChoisirUnCompte.setBounds(108, 83, 123, 15);
		contentPane.add(lblChoisirUnCompte);
		
		effaceCombo = new JComboBox();
		
		listeCompte = new JComboBox();
		listeCompte.setBounds(249, 80, 177, 24);
		contentPane.add(listeCompte);
		lblCompte.setBounds(310, 241, 131, 31);
		contentPane.add(lblCompte);
		listeCompte.addItemListener(new ItemListener() {
			public void itemStateChanged(ItemEvent e) {
				CompteSociete cpt = (CompteSociete) listeCompte.getSelectedItem();
				setCompte(cpt);
				if(cpt.getMandataires().isEmpty()){
					new Dialog().info("Ce compte n'a pas de Mandataire.");
				}
				else{
					alimentMand(cpt.getMandataires());
				}
			}
		});
		JLabel lblTypeDeCompte = new JLabel("Type de Compte :");
		lblTypeDeCompte.setBounds(38, 249, 120, 15);
		contentPane.add(lblTypeDeCompte);
		
		lblSolde = new JLabel("Solde :");
		lblSolde.setBounds(41, 299, 61, 15);
		contentPane.add(lblSolde);
		
		JLabel lblDecouvertAutoris = new JLabel("Decouvert Autorisé :");
		lblDecouvertAutoris.setBounds(310, 299, 131, 15);
		contentPane.add(lblDecouvertAutoris);
		
		btnFermer = new JButton("Fermer");
		btnFermer.setBounds(244, 339, 107, 25);
		contentPane.add(btnFermer);
		btnFermer.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				getControleur().fermerVue(VueCompteSociete.this);
			}
		});
		lbSolde = new JLabel("");
		lbSolde.setFont(new Font("Dialog", Font.BOLD, 12));
		lbSolde.setBounds(165, 299, 97, 24);
		contentPane.add(lbSolde);
		
		lbType = new JLabel("");
		lbType.setBounds(162, 249, 90, 23);
		contentPane.add(lbType);
		
		lbNum = new JLabel("");
		lbNum.setBounds(454, 249, 90, 23);
		contentPane.add(lbNum);
		
		lbDecouvert = new JLabel("");
		lbDecouvert.setBounds(457, 298, 87, 16);
		contentPane.add(lbDecouvert);
		
		JLabel lblVrificationDroitsMandataires = new JLabel("Vérification Droits Mandataires");
		lblVrificationDroitsMandataires.setFont(new Font("Dialog", Font.ITALIC, 10));
		lblVrificationDroitsMandataires.setBounds(12, 123, 161, 15);
		contentPane.add(lblVrificationDroitsMandataires);
		
		listMand = new JComboBox();
		listMand.addItemListener(new ItemListener() {
			public void itemStateChanged(ItemEvent e) {
				DroitsMandataire dM = getCompte().getMandataire(listMand.getSelectedItem().toString());
				afficheInfos(dM);
			}
		});
		listMand.setBounds(249, 147, 177, 24);
		contentPane.add(listMand);
		
		JLabel lblChoisirUnMandataire = new JLabel("Choisir un Mandataire");
		lblChoisirUnMandataire.setBounds(86, 150, 145, 15);
		contentPane.add(lblChoisirUnMandataire);
		
		JLabel lblDroits = new JLabel("Droits :");
		lblDroits.setBounds(34, 183, 61, 15);
		contentPane.add(lblDroits);
		
		
		ladroits = new JLabel("");
		ladroits.setBounds(100, 183, 58, 28);
		contentPane.add(ladroits);
		
		JSeparator separator_1 = new JSeparator();
		separator_1.setBounds(131, 227, 339, 2);
		contentPane.add(separator_1);
		
		textDroits = new JLabel("");
		textDroits.setBounds(61, 199, 510, 28);
		contentPane.add(textDroits);
	}
	
	protected void setCompte(CompteSociete cpt) {
		_compte = cpt;		
	}
	
	public CompteSociete getCompte(){
		return _compte;
	}
	

	public void setEtat (int etat){
		switch (etat) {
		case initiale: {
			btnEnregistrer.setEnabled(true);
			break;
			}
		}
	}
	
	private Societe getSociete() {
		return _societe;
	}
	private void setSociete(Societe societe) {
		 _societe = societe;
	}
	
	
	public void afficheInfos(DroitsMandataire d){
		ladroits.setText(d.getDroits().toString());
		switch(d.getDroits()){
			case A: textDroits.setText("Ce mandataire dispose de tous les droits sur ce compte."); break; 
			case B: textDroits.setText("Ce mandataire dispose des droits B."); break; 
			case C: textDroits.setText("Ce mandataire dispose de"); break; 
		}
		lbNum.setText(String.valueOf(getCompte().getNumero()));
		lbType.setText(getCompte().getType());
		lbSolde.setText(getCompte().getSolde().toString());
		lbDecouvert.setText(String.valueOf(getCompte().getDecouvertAutorise()));

		if(getCompte().getSolde() < 0){
			lbSolde.setForeground(Color.RED);
		}
		else{
			lbSolde.setForeground(Color.GREEN);
		}
	}
	
	public void setMandataires(HashSet<Mandataire> hashSet){
		_mandataires = hashSet;
	}
	
	public void setComptes(HashSet<CompteSociete> cpt){
		_cpts = cpt;
	}
	
	public HashSet<CompteSociete> getComptes(){
		return _cpts;
	}
	
	public void aliment() {
		boolean affiche = false;
		HashSet<CompteSociete> cpt = getComptes();
		Iterator<CompteSociete> it = cpt.iterator();
		while (it.hasNext()) {
			CompteSociete cpt1 = it.next();		affiche = true;
			
			if(!cpt1.getMandataires().isEmpty()){
				listeCompte.addItem(cpt1);
				affiche = true;
			}		
		}		
		if(!affiche){
			new Dialog().info("Ce compte n'a pas de Mandataire.");
			setEtat(1);
		}
	}
	
	public void alimentMand(HashMap<String, DroitsMandataire> mand) {
		Iterator<String> i = mand.keySet().iterator();
		
		int nb = listMand.getItemCount();
		for (int y=1; y<nb; y++) {
			listMand.removeItemAt(y);
		}
		
		while(i.hasNext()){
			listMand.addItem(i.next());
		}	
	}
}
